package com.qing.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 通过反射，动态的创建对象
 * 方法、属性、构造器都有setAccessible，当这些方法、属性为private修饰的时候，需要setAccessible设置为true，取消安全检查才可以赋值
 */

public class CreateObjectByReflection {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("com.qing.reflection.User");
        //构造一个对象，本质就是调用的无参构造器
        User o = (User) c.newInstance();
        System.out.println(o);

        //通过构造器创建对象
        Constructor constructor = c.getConstructor(String.class, String.class);
        User user1 = (User) constructor.newInstance("0001", "liuxu");
        System.out.println(user1);

        //通过反射调用方法赋值
        User user2 = (User) c.newInstance();
        Method setName = c.getMethod("setName", String.class);
        //使用invoke方法激活setName并赋值
        setName.invoke(user2, "huwenqing");
        c.getMethod("setId", String.class).invoke(user2, "0002");
        System.out.println(user2);

        //通过反射操作属性
        User user3 = (User) c.newInstance();
        Field id = c.getDeclaredField("id");
        //私有属性需要取消安全检查才能操作私有属性
        id.setAccessible(true);
        id.set(user3, "0003");

        Field name = c.getDeclaredField("name");
        name.setAccessible(true);
        name.set(user3, "xiaobaobao");
        System.out.println(user3);

    }
}
